package com.example.oom;

import java.util.ArrayList;
import java.util.List;

/**
 * 模拟 java.lang.OutOfMemoryError: Java heap space
 * -Xmx64m
 *
 */
public class HeapOOM {

    public static void main(String[] args) {
        HeapOOM oom = new HeapOOM();
        //oom.OOM1();
        //oom.OOM2();
        //oom.OOM3();
    }

    /**
     * 堆配置过小场景
     * 最大堆内存配置为 64M
     * 此时堆无法容纳一个 100MB 的对象
     */
    void OOM1() {
        byte[] bytes = new byte[100 * 1024 * 1024];
    }

    /**
     * 堆配置不当或，业务设计不合理场景
     * 大表查询，查询了全表数据，堆内存无法容纳
     */
    void OOM2() {
        List<byte[]> list = new ArrayList<>();
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            list.add(new byte[1024 * 1024]);
            System.out.println(i);
        }
    }

    void OOM3() {
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            new BadFinalizer();
            System.out.println(i);
        }
    }


    static class BadFinalizer {
        private byte[] data = new byte[1024 * 1024];

        @Override
        protected void finalize() throws Throwable {
            // 模拟好使或阻塞的 finalize
            Thread.sleep(1000);
        }
    }

}
